Domicílios, Unidades de Consumo e Pessoas

Na aula passada, vimos que os domicílios são a unidade amostral, enquando as unidades de consumo (UC) são a unidade básica de pesquisa. Em linhas gerais, isso significa que a seleção de pessoas entrevistadas pela POF se dá pela seleção dos domicílio, no procedimento descrito anteriormente. E que as informações da pesquisa são agregadas, no nível mais básico, por unidades de consumo. Ou seja, ao contrário da PNAD Contínua Anual, na qual a renda per capita (por exemplo) significa a renda média dos moradores de um mesmo domicílio, na POF ela significa a renda média dos membros da unidade de consumo.

Um domicílio contém ao menos uma unidade de consumo, e toda unidade de consumo pertence a um e apenas um domicílio. Analogamente, uma unidade de consumo contém ao menos uma pessoa, e toda pessoa pertence a uma e apenas uma unidade de consumo.

Um exemplo prático

Nessa discussão, dois registros são centrais. O primeiro é DOMICÍLIO, que contém dados sobre todos os domicílios da amostra, como água corrente, coleta de lixo e energia elétrica. Nesse registro, cada linha é um domicílio (o total de linhas é o total de domicílios na amostra da POF). O segundo é MORADOR, que contém dados de todas as pessoas da amostra, como idade, anos de estudo e se lancha na creche. Nesse registro, cada linha é uma pessoa, e o total de linhas é o total de pessoas na amostra da POF. Não há um registro “unidades de consumo”.

Assim, precisamos criar indicadores que permitam identificar os domicílios, unidades de consumo e pessoas entre os diferentes registros da POF (no último caso, nem sempre será possível).

Primeiro, vamos carregar os dois registros da POF

library(tidyverse)
pof_domicilio <- read_rds("./dados/pof_domicilio.rds")
pof_morador <- read_rds("./dados/pof_morador.rds")

Como a pof_domicilio tem o domicílio como maior nível de desagregação, só poderemos criar um identificador de domicílio (id_dom). Basicamente o id_dom é composto pelo identificador da UPA e pelo número do domicílio naquela UPA.

A função str_c agrupa conjuntos de caracteres. É semelhante ao CONCATENAR do Excel. A função n_distinct retorna o número de valores distintos da variável e n retorna o número de elementos (no caso de um df, o número de linhas)

pof_domicilio <- pof_domicilio %>% 
  mutate(id_dom = str_c(COD_UPA, NUM_DOM))

pof_domicilio %>% 
  summarise(numero_domicilios = n_distinct(id_dom),
            numero_linhas = n())
## # A tibble: 1 × 2
##   numero_domicilios numero_linhas
##               <int>         <int>
## 1             57920         57920

Como podemos ver, os números são iguais.

Agora na pof_morador, podemos criar identificadores de domicílio (id_dom), de unidade de consumo (id_uc) e de pessoas (id_pes).

pof_morador <- pof_morador %>% 
  mutate(id_dom = str_c(COD_UPA, NUM_DOM),
         id_uc  = str_c(COD_UPA, NUM_DOM, NUM_UC),
         id_pes = str_c(COD_UPA, NUM_DOM, NUM_UC, COD_INFORMANTE))

pof_morador %>% 
  summarise(numero_domicilios = n_distinct(id_dom),
            numero_uc = n_distinct(id_uc),
            numero_pessoas = n_distinct(id_pes),
            numero_linhas = n())
## # A tibble: 1 × 4
##   numero_domicilios numero_uc numero_pessoas numero_linhas
##               <int>     <int>          <int>         <int>
## 1             57920     58039         178419        178431

O número de domicílios é o mesmo do registro pof_domicílios - está correto. Mas o número de pessoas não está igual ao número de linhas. Qual foi o erro? O erro é um problema no tamanho das variáveis NUM_DOM, NUM_UC e COD_INFORMANTE.

pof_morador %>% 
  group_by(id_pes) %>% 
  mutate(x = n()) %>% 
  ungroup() %>% 
  filter(x > 1) %>% 
  select(COD_UPA, NUM_DOM, NUM_UC, COD_INFORMANTE, id_pes) %>% 
  arrange(id_pes)
## # A tibble: 24 × 5
##    COD_UPA   NUM_DOM NUM_UC COD_INFORMANTE id_pes       
##    <chr>     <chr>   <chr>  <chr>          <chr>        
##  1 120005467 1       1      11             1200054671111
##  2 120005467 11      1      1              1200054671111
##  3 130017335 1       1      11             1300173351111
##  4 130017335 11      1      1              1300173351111
##  5 130017335 1       1      12             1300173351112
##  6 130017335 11      1      2              1300173351112
##  7 130017335 1       1      13             1300173351113
##  8 130017335 11      1      3              1300173351113
...

Pegando as primeiras duas linhas como exemplo, vemos que o erro é causado pela combinação do mesmo valor para COD_UPA e NUM_UC com, em um caso NUM_DOM == 11 e COD_INFORMANTE == 1 e, no outro, NUM_DOM == 1 e COD_INFORMANTE == 11, gerando assim o mesmo id_pes para duas pessoas diferentes.

Para resolver isso, basta termos todos os valores de NUM_DOM, NUM_UC e COD_INFORMANTE com dois dígitos (01 ao invés de 1). Lembrando que precisamos dessa alteração em todos os registros da POF, pois esses indicadores são nossas chaves para agregar as diferentes tabelas.

Fazemos então

pof_domicilio <- pof_domicilio %>% 
  mutate(NUM_DOM = str_pad(NUM_DOM, 2, "left", "0"),
         id_dom = str_c(COD_UPA, NUM_DOM))

pof_morador <- pof_morador %>% 
  mutate(NUM_DOM = str_pad(NUM_DOM, 2, "left", "0"),
         NUM_UC = str_pad(NUM_UC, 2, "left", "0"),
         COD_INFORMANTE = str_pad(COD_INFORMANTE, 2, "left", "0"),
         id_dom = str_c(COD_UPA, NUM_DOM),
         id_uc  = str_c(COD_UPA, NUM_DOM, NUM_UC),
         id_pes = str_c(COD_UPA, NUM_DOM, NUM_UC, COD_INFORMANTE))

pof_domicilio %>% 
  summarise(numero_domicilios = n_distinct(id_dom),
            numero_linhas = n())
## # A tibble: 1 × 2
##   numero_domicilios numero_linhas
##               <int>         <int>
## 1             57920         57920
pof_morador %>% 
  summarise(numero_domicilios = n_distinct(id_dom),
            numero_uc = n_distinct(id_uc),
            numero_pessoas = n_distinct(id_pes),
            numero_linhas = n())
## # A tibble: 1 × 4
##   numero_domicilios numero_uc numero_pessoas numero_linhas
##               <int>     <int>          <int>         <int>
## 1             57920     58039         178431        178431

Problema resolvido. De fato, é tedioso fazer isso toda vez que for ler a POF. No entanto, é importante mostrar pequenos erros que podem ter efeitos negativos na nossa análise.

Checando o número de UCs

Para termos certeza de que estamos usando o número certo de unidades de consumo e de pessoas, podemos tentar replicar algumas tabelas do SIDRA. Como exemplo, vamos fazer o total de famílias e o tamanho médio de famílias para o Brasil e para a Paraíba. A tabela de referência no SIDRA é a 6977 e pode ser acessada clicando aqui.

pof_morador %>% 
  group_by(id_uc) %>% 
  mutate(n_uc = n(),
         PESO_FINAL = as.numeric(PESO_FINAL)) %>% 
  ungroup() %>% 
  filter(V0306 == "1") %>% 
  summarise(total_uc = sum(PESO_FINAL),
            tamanho_medio = round(sum(n_uc*PESO_FINAL)/sum(PESO_FINAL),2))
## # A tibble: 1 × 2
##    total_uc tamanho_medio
##       <dbl>         <dbl>
## 1 69017704.             3
pof_morador %>% 
  filter(UF == "25") %>% 
  group_by(id_uc) %>% 
  mutate(n_uc = n(),
         PESO_FINAL = as.numeric(PESO_FINAL)) %>% 
  ungroup() %>% 
  filter(V0306 == "1") %>% 
  summarise(total_uc = sum(PESO_FINAL),
            tamanho_medio = round(sum(n_uc*PESO_FINAL)/sum(PESO_FINAL),2))
## # A tibble: 1 × 2
##   total_uc tamanho_medio
##      <dbl>         <dbl>
## 1 1265385.          3.13

Exemplo de integração entre diferentes registros

Antes de falar sobre como calcular as despesas, vale demonstrar a integração entre os diferentes registros. Para analisarmos o valor e composição de despesas de diferentes grupos populacionais, precisamos de informações de pessoas, famílias e domicílios. Assim, é preciso integrar as informações de despesa, que estão nos registros Aluguel estimado, Caderneta coletiva, Despesa coletiva, Despesa individual, Rendimento do trabalho e Outros rendimentos aos registros Morador e Domicílio. Isso é feito por meio das variáveis indicadoras id_dom e id_uc. Vamos usar como exemplo os registros Morador e Aluguel estimado.

pof_aluguel_estimado <- read_rds("./dados/pof_aluguel_estimado.rds") %>% 
  mutate(NUM_DOM = str_pad(NUM_DOM, 2, "left", "0"),
         NUM_UC = str_pad(NUM_UC, 2, "left", "0"),
         id_dom = str_c(COD_UPA, NUM_DOM),
         id_uc  = str_c(COD_UPA, NUM_DOM, NUM_UC))

pof_join <- pof_morador %>% 
  left_join(pof_aluguel_estimado, by = "id_uc")

Percebam que, aqui, eu usei o left_join, com pof_morador no primeiro argumento. Isso vem porque queremos preservar todas as linhas dessa tabela, para podermos separar os gastos por características das pessoas e das famílias.

Despesas

Para começar a olhar as despesas, temos três arquivos centrais:

indice <- readxl::read_xls("./memoria_de_calculo/Indice_Despesa.xls")
tradutor <- readxl::read_xls("./tradutores/Tradutor_Despesa_Geral.xls")
cadastro <- readxl::read_xls("./documentacao/Cadastro de Produtos.xls", 
                             col_types = "text")

O cadastro de produtos relaciona o código do produto com sua respectiva descrição e o quadro no qual o produto se encontra.

cadastro
## # A tibble: 13,474 × 3
##    QUADRO `CÓDIGO DO PRODUTO` `DESCRIÇÃO DO PRODUTO`                            
##    <chr>  <chr>               <chr>                                             
##  1 0      000101              ALUGUEL ESTIMADO                                  
##  2 6      600101              ENERGIA ELETRICA (KWH)                            
##  3 6      600201              AGUA E ESGOTO                                     
##  4 6      600301              GAS ENCANADO                                      
##  5 6      600401              TELEFONE FIXO                                     
##  6 6      600501              ACESSO A INTERNET (DISCADA, BANDA LARGA, VIA SATE…
...

A tabela indice apenas relaciona o nível de desagregação da despesa com sua respectiva descrição.

indice
## # A tibble: 93 × 3
##    INDICE   NIVEL DESCRICAO            
##     <dbl>   <dbl> <chr>                
##  1      1       0 DESPESA TOTAL        
##  2      2       1 DESPESAS CORRENTES   
##  3      3      11 DESPESAS DE CONSUMO  
##  4      4    1101 ALIMENTACAO          
##  5      5    1102 HABITACAO            
##  6      6  110201 ALUGUEL              
...

Por fim, a tabela mais importante para nós é a tradutor, pois ela contém todas as informações que precisamos para conduzir uma análise de despesa.

tradutor
## # A tibble: 5,318 × 14
##    Codigo Variavel   Nivel_0 Descricao_0 Nivel_1 Descricao_1 Nivel_2 Descricao_2
##     <dbl> <chr>        <dbl> <chr>         <dbl> <chr>         <dbl> <chr>      
##  1  10001 V8000_DEF…       0 Despesa To…       1 Despesas C…      11 Despesas d…
##  2  10004 V8000_DEF…       0 Despesa To…       1 Despesas C…      11 Despesas d…
##  3  10002 V8000_DEF…       0 Despesa To…       1 Despesas C…      11 Despesas d…
##  4  10009 V8000_DEF…       0 Despesa To…       1 Despesas C…      11 Despesas d…
##  5      1 V8000_DEF…       0 Despesa To…       1 Despesas C…      11 Despesas d…
##  6  10005 V8000_DEF…       0 Despesa To…       1 Despesas C…      11 Despesas d…
...

Códigos dos itens

Na POF, cada item é registrado com um código de 7 dígitos, identificado pela variável V9001. Os dois primeiros dígitos são correspondentes ao quadro, enquanto os outros 5 são identificadores de cada item de despesa. Porém, olhando a tabela cadastro, vemos que alguns código possuem menos de 7 dígitos. Isso é causado pela mesma questão que aconteceu com as variáveis indicadoras. Se o número do quadro é 6 (por exemplo), o código fica com 6 dígitos (porque o dado não carrega como “06”). Então, para evitar quaisquer problemas, vamos transformar todos os códigos em 7 dígitos

cadastro <- cadastro %>% 
  janitor::clean_names() %>% 
  mutate(codigo_7 = str_pad(codigo_do_produto, 7, "left", "0"))

A tabela tradutor também tem valores de código com menos de 7 dígitos. Em parte, isso também é causado por essa questão do número do quadro ter menos de 2 dígitos. No entanto, a principal questão é que não foram incluídos em 2 últimos dígitos de cada item. Essencialmente, itens muito semelhantes (ou da mesma natureza) foram agrupados nos códigos de 5 dígitos. Vamos ver alguns exemplos disso, usando a tabela cadastro.

cadastro <- cadastro %>% 
  mutate(codigo_5 = str_sub(codigo_7, 1, -3))

cadastro %>% 
  group_by(codigo_5) %>% 
  mutate(n = n()) %>% 
  ungroup() %>% 
  filter(n > 1) %>% 
  arrange(n, codigo_5)
## # A tibble: 9,938 × 6
##    quadro codigo_do_produto descricao_do_produto         codigo_7 codigo_5     n
##    <chr>  <chr>             <chr>                        <chr>    <chr>    <int>
##  1 7      700101            GAS DE BOTIJAO (COMBUSTIVEL… 0700101  07001        2
##  2 7      700102            GAS DE BUJAO (COMBUSTIVEL D… 0700102  07001        2
##  3 7      700201            AGUA PARA USO GERAL          0700201  07002        2
##  4 7      700202            PIPA DE AGUA                 0700202  07002        2
##  5 7      701001            GAS DE BOTIJAO PARA ILUMINA… 0701001  07010        2
##  6 7      701002            GAS DE BUJAO PARA ILUMINACAO 0701002  07010        2
##  7 8      800201            TIJOLO (PEQUENOS REPAROS)    0800201  08002        2
##  8 8      800202            BLOCO DE CERAMICA (PEQUENOS… 0800202  08002        2
##  9 8      800801            TINTA (PEQUENOS REPAROS)     0800801  08008        2
## 10 8      800802            VERNIZ (PEQUENOS REPAROS)    0800802  08008        2
...

Como exemplos, temos gás de botijão e gás de bujão e tinta (pequenos reparos) e verniz (pequenos reparos).

Assim, precisamos transformar os códigos da tabela tradutor em 5 dígitos - e é esse que usaremos para analisar os dados da POF

tradutor <- tradutor %>% 
  janitor::clean_names() %>% 
  mutate(codigo = str_pad(codigo, 5, "left", "0"),
         descricao_2 = case_when(descricao_2 == "Despesas de consumo" ~ "Despesas de Consumo",
                                 TRUE ~ descricao_2))

Variáveis

Agora que temos os códigos de 5 dígitos na tabela tradutor, falta uma informação para começarmos a analisar as despesas - a variável relevante de cada gasto. Basicamente, a POF analisa:

  • Valor da despesa/aquisição - V8000_DEFLA
  • INSS e outras contribuições - V1904_DEFLA
  • Dedução com previdência pública - V531112_DEFLA
  • Dedução de Imposto de Renda - V531122_DEFLA
  • Dedução de ISS - V531132_DEFLA
  • Outras deduções - V8501_DEFLA

Existem alguns itens que têm mais de uma variável - que representam gastos de categorias e classificações diferentes. Por exemplo, gastos de manutenção do lar com eletricista envolvem o valor da despesa (V8000_DEFLA), associado à categoria Despesa Total > Despesas Correntes > Despesas de Consumo > Habitação > Manutenção do lar e recolhimento de INSS (V1904_DEFLA), associado à categoria Despesa Total > Despesas Correntes > Outras despesas correntes > Contribuições trabalhistas.

Assim, além do código, precisamos acertar a variável na hora de calcular as despesas.

Deflação e anualização

Os últimos pontos antes de realizar a análise das despesas são a deflação e a anualização. Como dito na primeira aula, as informações da POF se distribuem ao longo de 24 meses, sendo estabelecido o dia 15 de janeiro de 2018 como data de refrência. Assim, todos os valores precisam ser deflacionados para representarem valores médios desta data. Por sorte, o IBGE já disponibiliza os valores deflacionados: são as variáveis que olhamos acima e que estão na tabela despesa.

A anualização, por sua vez, vem do fato de existirem 4 períodos de referência para despesas: 7, 30 e 90 dias e 12 meses. Respectivamente, precisamos multiplicar o valor da despesa em cada um desses períodos por 52, 12, 4 ou 1 (variável FATOR_ANUALIZACAO). Para alguns itens de despesas de 12 meses (FATOR_ANUALIZACAO == 1), temos também o número de meses de realização da despesa (variável V9011). Para saber quais itens se encaixam nesse segundo caso, o dicionário de variáveis explicita os quadros que precisam da variável V9011 - podemos também olhar no código fornecido pelo IBGE memoria_de_calculo/R/Tabela de Despesa Geral.R.

OK! Agora temos tudo o que precisamos.

Lendo as despesas no R

Basicamente, o processo se resume em:

Como as possibilidades são virtualmente infinitas, vamos focar na tabela 6715 do SIDRA.

Lendo os arquivos de microdados

Já vimos como ler os microdados e até ja criamos arquivos .rds. Em um momento futuro, podemos salvar ainda mais tempo e espaço criando arquivos .rds de microdados apenas com as colunas relevantes para a análise de despesa, mas isso fica na conta de caa um. O que precisa ser feito agora é saber quais os arquivos de microdados relevantes.

Basicamente, precisamos de todos os registros da POF que possuem alguma das variáveis explicitadas na tabela tradutor. A saber:

tradutor %>% 
  distinct(variavel)
## # A tibble: 6 × 1
##   variavel     
##   <chr>        
## 1 V8000_DEFLA  
## 2 V531122_DEFLA
## 3 V531132_DEFLA
## 4 V1904_DEFLA  
## 5 V531112_DEFLA
## 6 V8501_DEFLA

Podemos também olhar em memoria_de_calculo > R > Tabela de Despesa Geral.R.

Os registros relevantes são:

  • Aluguel estimado
  • Caderneta coletiva
  • Despesa coletiva
  • Despesa individual
  • Rendimento do trabalho
  • Outros rendimentos

Vamos carregá-los

pof_aluguel_estimado <- read_rds("./dados/pof_aluguel_estimado.rds")
pof_caderneta_coletiva <- read_rds("./dados/pof_caderneta_coletiva.rds")
pof_despesa_coletiva <- read_rds("./dados/pof_despesa_coletiva.rds")
pof_despesa_individual <- read_rds("./dados/pof_despesa_individual.rds")
pof_rendimento_trabalho <- read_rds("./dados/pof_rendimento_trabalho.rds")
pof_outros_rendimentos <- read_rds("./dados/pof_outros_rendimentos.rds")

Construindo os códigos de 5 dígitos de cada item

A variável que tem o código dos itens é V9001. Antes de tudo, precisamos checar quantos dígitos temos nos dados originais:

pof_aluguel_estimado %>% mutate(n_cod = nchar(V9001)) %>% distinct(n_cod)
## # A tibble: 1 × 1
##   n_cod
##   <int>
## 1     7
pof_caderneta_coletiva %>% mutate(n_cod = nchar(V9001)) %>% distinct(n_cod)
## # A tibble: 1 × 1
##   n_cod
##   <int>
## 1     7
pof_despesa_coletiva %>% mutate(n_cod = nchar(V9001)) %>% distinct(n_cod)
## # A tibble: 2 × 1
##   n_cod
##   <int>
## 1     6
## 2     7
pof_despesa_individual %>% mutate(n_cod = nchar(V9001)) %>% distinct(n_cod)
## # A tibble: 1 × 1
##   n_cod
##   <int>
## 1     7
pof_rendimento_trabalho %>% mutate(n_cod = nchar(V9001)) %>% distinct(n_cod)
## # A tibble: 1 × 1
##   n_cod
##   <int>
## 1     7
pof_outros_rendimentos %>% mutate(n_cod = nchar(V9001)) %>% distinct(n_cod)
## # A tibble: 1 × 1
##   n_cod
##   <int>
## 1     7

Podemos ver que, exceto em alguns casos no registro Despesa Coletiva, temos 7 dígitos. Como discutimos anteriormente, para o caso geral, basta eliminar os 2 últimos para termos o código da mesma forma que está na tabela tradutor. Em relação aos itens com 6 dígitos, isso é causado (igual a antes) pela variável QUADRO ter apenas um dígito. Lembrando, os dois primeiros dígitos do código de item corresponde ao quadro. Mas quando o valor da variável QUADRO é menor que 10, é registrado apenas um dígito (6 ao invés de 06). Então precisamos colocar esse dígito adicional no início. Para confirmar:

pof_despesa_coletiva %>% 
  mutate(n_cod = nchar(V9001)) %>% 
  filter(n_cod == 6) %>% 
  distinct(QUADRO)
## # A tibble: 4 × 1
##   QUADRO
##   <chr> 
## 1 6     
## 2 7     
## 3 9     
## 4 8

Assim,, fazemos:

pof_aluguel_estimado <- pof_aluguel_estimado %>% 
  mutate(codigo_5 = str_sub(V9001, 1, -3))

pof_caderneta_coletiva <- pof_caderneta_coletiva %>% 
  mutate(codigo_5 = str_sub(V9001, 1, -3))

pof_despesa_coletiva <- pof_despesa_coletiva %>% 
  mutate(V9001 = str_pad(V9001, 7, "left", "0")) %>% 
  mutate(codigo_5 = str_sub(V9001, 1, -3))

pof_despesa_individual <- pof_despesa_individual %>% 
  mutate(codigo_5 = str_sub(V9001, 1, -3))

pof_rendimento_trabalho <- pof_rendimento_trabalho %>% 
  mutate(codigo_5 = str_sub(V9001, 1, -3))

pof_outros_rendimentos <- pof_outros_rendimentos %>% 
  mutate(codigo_5 = str_sub(V9001, 1, -3))

Vamos checar se tudos têm 5 dígitos:

pof_aluguel_estimado %>% mutate(n_cod = nchar(codigo_5)) %>% distinct(n_cod)
## # A tibble: 1 × 1
##   n_cod
##   <int>
## 1     5
pof_caderneta_coletiva %>% mutate(n_cod = nchar(codigo_5)) %>% distinct(n_cod)
## # A tibble: 1 × 1
##   n_cod
##   <int>
## 1     5
pof_despesa_coletiva %>% mutate(n_cod = nchar(codigo_5)) %>% distinct(n_cod)
## # A tibble: 1 × 1
##   n_cod
##   <int>
## 1     5
pof_despesa_individual %>% mutate(n_cod = nchar(codigo_5)) %>% distinct(n_cod)
## # A tibble: 1 × 1
##   n_cod
##   <int>
## 1     5
pof_rendimento_trabalho %>% mutate(n_cod = nchar(codigo_5)) %>% distinct(n_cod)
## # A tibble: 1 × 1
##   n_cod
##   <int>
## 1     5
pof_outros_rendimentos %>% mutate(n_cod = nchar(codigo_5)) %>% distinct(n_cod)
## # A tibble: 1 × 1
##   n_cod
##   <int>
## 1     5

Aparentemente, tudo certo.

Calcular o valor anualizado

Essa etapa é, na minha opinião, a mais problemática. Lembrando, precisamos saber a variável certa, multiplicar o fator de anualização e, quando necessário, multiplicar pelo número de meses da despesa.

O primeiro passo é juntar a tabela tradutor em todos os registros da POF. Isso faz com que tenhamos, para cada despesa, a(s) variável(is) relevante(s) e o grupos ao qual cada gasto pertence (V8000_DEFLA, V531122_DEFLA, V531132_DEFLA, V1904_DEFLA, V531112_DEFLA, V8501_DEFLA).

Lembrando que determinadas despesas possuem mais de uma variável associada (e, portanto, mais de um grupo de despesa). Nesses casos, quando fazemos o left_join com a tabela tradutor, teremos um aumento do número de linhas na nossa tabela final. Isso acontece porque um mesmo código de despesa está associado a tipos diferentes de despesa (no caso do rendimento do trabalho por exemplo, a desconto de previdência pública, de imposto de renda e outros).

Mas esse é justamente o nosso objetivo. Antes de fazer o join com a tabela tradutor, temos:

tamanho_antes <- bind_rows(
  pof_aluguel_estimado %>% 
    summarise(nome = "aluguel_estimado",
              n_linhas = n()),
  pof_caderneta_coletiva %>% 
    summarise(nome = "caderneta_coletiva",
              n_linhas = n()),
  pof_despesa_coletiva %>% 
    summarise(nome = "despesa_coletiva",
              n_linhas = n()),
  pof_despesa_individual %>% 
    summarise(nome = "despesa_individual",
              n_linhas = n()),
  pof_rendimento_trabalho %>% 
    summarise(nome = "rendimento_trabalho",
              n_linhas = n()),
  pof_outros_rendimentos %>% 
    summarise(nome = "outros_rendimentos",
              n_linhas = n())
)

Fazendo o join:

pof_aluguel_estimado <- pof_aluguel_estimado %>% 
  left_join(tradutor, by = c("codigo_5" = "codigo"))

pof_caderneta_coletiva <- pof_caderneta_coletiva %>% 
  left_join(tradutor, by = c("codigo_5" = "codigo"))

pof_despesa_coletiva <- pof_despesa_coletiva %>% 
  left_join(tradutor, by = c("codigo_5" = "codigo"))

pof_despesa_individual <- pof_despesa_individual %>% 
  left_join(tradutor, by = c("codigo_5" = "codigo"))

pof_rendimento_trabalho <- pof_rendimento_trabalho %>% 
  left_join(tradutor, by = c("codigo_5" = "codigo"))

pof_outros_rendimentos <- pof_outros_rendimentos %>% 
  left_join(tradutor, by = c("codigo_5" = "codigo"))
tamanho_depois <- bind_rows(
  pof_aluguel_estimado %>% 
    summarise(nome = "aluguel_estimado",
              n_linhas = n()),
  pof_caderneta_coletiva %>% 
    summarise(nome = "caderneta_coletiva",
              n_linhas = n()),
  pof_despesa_coletiva %>% 
    summarise(nome = "despesa_coletiva",
              n_linhas = n()),
  pof_despesa_individual %>% 
    summarise(nome = "despesa_individual",
              n_linhas = n()),
  pof_rendimento_trabalho %>% 
    summarise(nome = "rendimento_trabalho",
              n_linhas = n()),
  pof_outros_rendimentos %>% 
    summarise(nome = "outros_rendimentos",
              n_linhas = n())
)

left_join(tamanho_antes, tamanho_depois, by = "nome", suffix = c("_antes", "_depois"))
## # A tibble: 6 × 3
##   nome                n_linhas_antes n_linhas_depois
##   <chr>                        <int>           <int>
## 1 aluguel_estimado             48935           48935
## 2 caderneta_coletiva          789995          789995
## 3 despesa_coletiva            478572          488849
## 4 despesa_individual         1836032         1836032
## 5 rendimento_trabalho          97075          283369
## 6 outros_rendimentos          206108          206108

Os únicos registros que aumentaram o número de linhas foram: despesa coletiva e rendimento do trabalho. Em relação ao primeiro, o aumento é muito pequeno, pois ocorre apenas poucas despesas com manutenção do lar, como eletricista e mordomo (entre outros) para as quais há a despesa em si e recolhimento de INSS. Já para o rendimento o trabalho, o aumento é enorme, pois representa desconto de previdência, de IR e outros, muito mais comuns.

Agora, precisamos criar uma coluna valor que contenha o valor único de cada código + grupo de despesa. Isso é feito através da coluna variavel, originalmente na tabela tradutor. Nos registros em que temos apenas uma variável relevante de despesa (as que não mudaram o número de linhas depois do join), basta criar uma nova coluna igual à já existente.

pof_aluguel_estimado <- pof_aluguel_estimado %>% 
  mutate(valor = V8000_DEFLA)

pof_caderneta_coletiva <- pof_caderneta_coletiva %>% 
  mutate(valor = V8000_DEFLA)

pof_despesa_individual <- pof_despesa_individual %>% 
  mutate(valor = V8000_DEFLA)

pof_outros_rendimentos <- pof_outros_rendimentos %>% 
  mutate(valor = V8501_DEFLA)

Nos dois casos especiais (despesa coletiva e rendimento do trabalho), precisamos relacionar a variável certa em cada linha. Para isso, vamos usar a função case_when:

pof_despesa_coletiva <- pof_despesa_coletiva %>% 
  mutate(valor = case_when(variavel == "V8000_DEFLA" ~ V8000_DEFLA,
                           variavel == "V1904_DEFLA" ~ V1904_DEFLA))

pof_rendimento_trabalho <- pof_rendimento_trabalho %>% 
  mutate(valor = case_when(variavel == "V531112_DEFLA" ~ V531112_DEFLA,
                           variavel == "V531122_DEFLA" ~ V531122_DEFLA,
                           variavel == "V531132_DEFLA" ~ V531132_DEFLA))

Agora, para todos os elementos na coluna valor, precisamos multiplicar pelo fator de anualização:

pof_aluguel_estimado <- pof_aluguel_estimado %>% 
  mutate(valor = as.numeric(valor),
         FATOR_ANUALIZACAO = as.numeric(FATOR_ANUALIZACAO)) %>% 
  mutate(valor_fator_anu = valor*FATOR_ANUALIZACAO)

pof_caderneta_coletiva <- pof_caderneta_coletiva %>%
  mutate(valor = as.numeric(valor),
         FATOR_ANUALIZACAO = as.numeric(FATOR_ANUALIZACAO)) %>% 
  mutate(valor_fator_anu = valor*FATOR_ANUALIZACAO)

pof_despesa_coletiva <- pof_despesa_coletiva %>% 
  mutate(valor = as.numeric(valor),
         FATOR_ANUALIZACAO = as.numeric(FATOR_ANUALIZACAO)) %>% 
  mutate(valor_fator_anu = valor*FATOR_ANUALIZACAO)

pof_despesa_individual <- pof_despesa_individual %>%
  mutate(valor = as.numeric(valor),
         FATOR_ANUALIZACAO = as.numeric(FATOR_ANUALIZACAO)) %>% 
  mutate(valor_fator_anu = valor*FATOR_ANUALIZACAO)

pof_rendimento_trabalho <- pof_rendimento_trabalho %>% 
  mutate(valor = as.numeric(valor),
         FATOR_ANUALIZACAO = as.numeric(FATOR_ANUALIZACAO)) %>% 
  mutate(valor_fator_anu = valor*FATOR_ANUALIZACAO)

pof_outros_rendimentos <- pof_outros_rendimentos %>%
  mutate(valor = as.numeric(valor),
         FATOR_ANUALIZACAO = as.numeric(FATOR_ANUALIZACAO)) %>% 
  mutate(valor_fator_anu = valor*FATOR_ANUALIZACAO)

A última etapa é criar, de fato, o valor anualizado, multiplicando certas despesas pelo número de meses. Podemos saber quais são essas despesas olhando cada registro do dicionário de variáveis, na descrição da variável V9011. Lá diz quais os quadros cujos valores precisam ser multiplicados por essa variável.

O registro caderneta individual não tem a variável V9011, então não há alteração a ser feita. Nos registros aluguel estimado e rendimento do trabalho, todas as despesas precisam ser multiplicadas por V9011 Assim:

pof_aluguel_estimado <- pof_aluguel_estimado %>% 
  mutate(V9011 = as.numeric(V9011)) %>% 
  mutate(valor_anualizado = valor_fator_anu*V9011)

pof_caderneta_coletiva <- pof_caderneta_coletiva %>% 
  mutate(valor_anualizado = valor_fator_anu)

pof_despesa_coletiva <- pof_despesa_coletiva %>% 
  mutate(V9011 = as.numeric(V9011)) %>% 
  mutate(valor_anualizado = case_when(QUADRO %in% c("10","19") ~ valor_fator_anu*V9011,
                                      TRUE ~ valor_fator_anu))

pof_despesa_individual <- pof_despesa_individual %>%
  mutate(V9011 = as.numeric(V9011)) %>% 
  mutate(valor_anualizado = case_when(QUADRO %in% c("44","47","48","49","50") ~ valor_fator_anu*V9011,
                                      TRUE ~ valor_fator_anu))

pof_rendimento_trabalho <- pof_rendimento_trabalho %>% 
  mutate(V9011 = as.numeric(V9011)) %>% 
  mutate(valor_anualizado = valor_fator_anu*V9011)

pof_outros_rendimentos <- pof_outros_rendimentos %>%
  mutate(V9011 = as.numeric(V9011)) %>% 
  mutate(valor_anualizado = case_when(QUADRO == "54" ~ valor_fator_anu*V9011,
                                      TRUE ~ valor_fator_anu))

Agregando as informações

Agora já temos todas as informações de despesa. O que falta agora é juntar tudo em uma tabela só (que podemos salvar para não ter que repetir esse processo). De fato, agora o que precisamos dos registros com os quais temos trabalhado é apenas: indicador de uc, as categorias de despesa e o valor.

pof_aluguel_estimado <- pof_aluguel_estimado %>%
  mutate(NUM_DOM = str_pad(NUM_DOM, 2, "left", "0"),
         NUM_UC = str_pad(NUM_UC, 2, "left", "0"),
         id_dom = str_c(COD_UPA, NUM_DOM),
         id_uc  = str_c(COD_UPA, NUM_DOM, NUM_UC)) %>% 
  select(id_dom, id_uc, codigo_5, valor_anualizado,
         nivel_0, descricao_0,
         nivel_1, descricao_1,
         nivel_2, descricao_2,
         nivel_3, descricao_3,
         nivel_4, descricao_4,
         nivel_5, descricao_5)

pof_caderneta_coletiva <- pof_caderneta_coletiva %>%
  mutate(NUM_DOM = str_pad(NUM_DOM, 2, "left", "0"),
         NUM_UC = str_pad(NUM_UC, 2, "left", "0"),
         id_dom = str_c(COD_UPA, NUM_DOM),
         id_uc  = str_c(COD_UPA, NUM_DOM, NUM_UC)) %>% 
  select(id_dom, id_uc, codigo_5, valor_anualizado,
         nivel_0, descricao_0,
         nivel_1, descricao_1,
         nivel_2, descricao_2,
         nivel_3, descricao_3,
         nivel_4, descricao_4,
         nivel_5, descricao_5)

pof_despesa_coletiva <- pof_despesa_coletiva %>%
  mutate(NUM_DOM = str_pad(NUM_DOM, 2, "left", "0"),
         NUM_UC = str_pad(NUM_UC, 2, "left", "0"),
         id_dom = str_c(COD_UPA, NUM_DOM),
         id_uc  = str_c(COD_UPA, NUM_DOM, NUM_UC)) %>% 
  select(id_dom, id_uc, codigo_5, valor_anualizado,
         nivel_0, descricao_0,
         nivel_1, descricao_1,
         nivel_2, descricao_2,
         nivel_3, descricao_3,
         nivel_4, descricao_4,
         nivel_5, descricao_5)

pof_despesa_individual <- pof_despesa_individual %>%
  mutate(NUM_DOM = str_pad(NUM_DOM, 2, "left", "0"),
         NUM_UC = str_pad(NUM_UC, 2, "left", "0"),
         id_dom = str_c(COD_UPA, NUM_DOM),
         id_uc  = str_c(COD_UPA, NUM_DOM, NUM_UC)) %>% 
  select(id_dom, id_uc, codigo_5, valor_anualizado,
         nivel_0, descricao_0,
         nivel_1, descricao_1,
         nivel_2, descricao_2,
         nivel_3, descricao_3,
         nivel_4, descricao_4,
         nivel_5, descricao_5)

pof_rendimento_trabalho <- pof_rendimento_trabalho %>%
  mutate(NUM_DOM = str_pad(NUM_DOM, 2, "left", "0"),
         NUM_UC = str_pad(NUM_UC, 2, "left", "0"),
         id_dom = str_c(COD_UPA, NUM_DOM),
         id_uc  = str_c(COD_UPA, NUM_DOM, NUM_UC)) %>% 
  select(id_dom, id_uc, codigo_5, valor_anualizado,
         nivel_0, descricao_0,
         nivel_1, descricao_1,
         nivel_2, descricao_2,
         nivel_3, descricao_3,
         nivel_4, descricao_4,
         nivel_5, descricao_5)

pof_outros_rendimentos <- pof_outros_rendimentos %>%
  mutate(NUM_DOM = str_pad(NUM_DOM, 2, "left", "0"),
         NUM_UC = str_pad(NUM_UC, 2, "left", "0"),
         id_dom = str_c(COD_UPA, NUM_DOM),
         id_uc  = str_c(COD_UPA, NUM_DOM, NUM_UC)) %>% 
  select(id_dom, id_uc, codigo_5, valor_anualizado,
         nivel_0, descricao_0,
         nivel_1, descricao_1,
         nivel_2, descricao_2,
         nivel_3, descricao_3,
         nivel_4, descricao_4,
         nivel_5, descricao_5)

Vamos criar agora nosso df com todas as informações de despesa para nossa análise.

pof_despesa <- bind_rows(pof_aluguel_estimado,
                         pof_caderneta_coletiva,
                         pof_despesa_coletiva,
                         pof_despesa_individual,
                         pof_rendimento_trabalho,
                         pof_outros_rendimentos)

Por fim, vamos salvar essa tabela como .rds.

pof_despesa %>% write_rds("./dados/pof_despesa.rds", compress = "gz")

Na próxima aula vamos juntar essa tabela de despesa com o registro moradore replicar tabela 6715 do SIDRA.